<?php
require_once(dirname(__FILE__)."/BAPElement.php");

/**
* Wiki Template.
	Tiene la forma {{plantilla | x | y {{valor}} | z }}
*/
class BAPTemplate extends BAPElement {

	/** Llama a la funcion  general para crear el objeto */
	static public function &create(&$parser) {
		return parent::create("BAPTemplate", &$parser);
	}	

	/** Representacion del objeto como una cadena */
/**
	function getValue() {
		$ret = "{{ ".$this->name."\n";
		
		foreach ($this->children as &$child) {
			$ret = "{$ret}| ".$child->getValue();
		}

		$ret = $ret."}}";

		return $ret;
	}
*/
	function getValue() {
		return get_class();
	}

	function __toString() {
		$ret = "{{ ".$this->name."\n";
		
		/** Concatenamos los valores internos, separandolos con la | */
		foreach ($this->children as &$child) {
			$ret = "{$ret}| ".$child;
		}

		$ret = $ret."}}";

		return $ret;
	}
	
	/** Esta funcion devuelve un elemento hijo con un nombre determinado */
	function &getField($nodeName) {
		if (is_string($nodeName)) {
			$nodeName = trim($nodeName);
			if ($nodeName!='') {
				foreach ($this->children as &$nodo) {
					if (is_a($nodo, "BAPTemplateField")) {
						if (trim($nodo->name) == $nodeName) {
							return $nodo;
						}
					}
				}
			} else {
				return null;
			}
		}
		if (is_int($nodeName)) {
			$iNode = 0;
			foreach ($this->children as &$nodo) {
				if (is_a($nodo, "BAPTemplateField")) {
					if ($iNode == $nodeName) return $nodo;
					$iNode++;
				}
			}
		}
		return null;
	}
	
	function parse() {
		/** Tiene la forma
		{{ ID | text-elment | text-element | | | text-element | ... }}
		*/
		$sym = $this->parser->currentSymbol();
		if ( $sym['simbolo']!= BasicArticleParser::SYM_DOBLE_OPEN) return null;

		$sym = $this->parser->searchNextSymbol();		
		
		// Ahora, texto, que sera el ID 
		if ($sym['simbolo']!=BasicArticleParser::SYM_TEXT) {
			// ha fallado 
			return false;
		}
		
		// tomamos el identificador 
		$this->name = $sym['cadena'];
		
		$sym = $this->parser->searchNextSymbol();
		while ($sym['simbolo']!=BasicArticleParser::SYM_END) {
			switch ($sym['simbolo']) {
				case BasicArticleParser::SYM_PIPE: 
					// todo correcto, nos lo saltamos 
					$this->parser->searchNextSymbol();
					// TODO: igual deberiamos incluir un elemento en "blanco" como control para 
					// poder contabilizar bien los parametros a la hora de reconstruir.
					// Si dejasemos un espacio entre | y |, esto no haria falta... es un caso especial
					break;
				case BasicArticleParser::SYM_DOBLE_OPEN:
				case BasicArticleParser::SYM_TEXT:
					// tenemos que reconocer el texto 
					$texto = BAPTemplateField::create(&$this->parser);
					if ($texto == null) return false;
					array_push($this->children, $texto);
					break;
				case BasicArticleParser::SYM_DOBLE_CLOSE:
					// fin 
					$this->parser->searchNextSymbol();
					return true;
					break;
				default:
					return false;					
			}
			$sym = $this->parser->currentSymbol();
		}
	}

}
?>